﻿//using System;
//using Microsoft.Xna.Framework;
//using Microsoft.Xna.Framework.Graphics;
//using Phoenix.Xna.Framework.Components.Cameras;
//using Phoenix.Xna.Framework.FrameworkExtensions;
//using Phoenix.Xna.Framework.Graphics;

//namespace Phoenix.Xna.Framework.Components.Sky
//{
//    public class MoonShader : Shader<SkyDomeShaderState>
//    {
//        public Matrix World
//        {
//            get { return EffectMap.GetParameter<Matrix>("World"); }
//            set { EffectMap.SetParameter<Matrix>("World", value); }
//        }
//        public Matrix View
//        {
//            get { return EffectMap.GetParameter<Matrix>("View"); }
//            set { EffectMap.SetParameter<Matrix>("View", value); }
//        }
//        public Matrix Projection
//        {
//            get { return EffectMap.GetParameter<Matrix>("Projection"); }
//            set { EffectMap.SetParameter<Matrix>("Projection", value); }
//        }
//        public Texture2D Texture
//        {
//            get { return EffectMap.GetParameter<Texture2D>("Texture"); }
//            set { EffectMap.SetParameter<Texture2D>("Texture", value); }
//        }
//        public float Alpha
//        {
//            get { return EffectMap.GetParameter<float>("Alpha"); }
//            set { EffectMap.SetParameter<float>("Alpha", value); }
//        }
//        public QuadRenderer TextureRenderer { get; set; }

//        public MoonShader(string effectMap)
//            : base(effectMap)
//        {
//        }

//        public MoonShader(EffectMap effectMap)
//            : base(effectMap)
//        {
//        }

//        public MoonShader(string id, string effectMap)
//            : base(id, effectMap)
//        {
//        }

//        public MoonShader(string id, EffectMap effectMap)
//            : base(id, effectMap)
//        {
//        }

//        private void DrawGlow(GameTime gameTime, SkyDomeShaderState state)
//        {
//            World = Matrix.CreateRotationX(state.Theta + (float)Math.PI / 2.0f) *
//                Matrix.CreateRotationY(-state.Phi + (float)Math.PI / 2.0f) *
//                Matrix.CreateTranslation(state.SunlightDirection.Inverse() * 5) *
//                Matrix.CreateRotationZ((float)Math.PI) *
//                Matrix.CreateTranslation(Camera.ActiveCamera.Position);
//            EffectMap.LoadParameter("GlowTexture");

//            foreach(EffectPass p in EffectMap.Begin())
//            {
//                p.Begin();
//                TextureRenderer.Draw(gameTime);
//                p.End();
//            }

//            EffectMap.End();
//        }

//        private void DrawMoon(GameTime gameTime, SkyDomeShaderState state)
//        {
//            World = Matrix.CreateRotationX(state.Theta + (float)Math.PI / 2.0f) *
//                Matrix.CreateRotationY(-state.Phi + (float)Math.PI / 2.0f) *
//                Matrix.CreateTranslation(state.SunlightDirection.Inverse() * 15) *
//                Matrix.CreateRotationZ((float)Math.PI) *
//                Matrix.CreateTranslation(Camera.ActiveCamera.Position);
//            EffectMap.LoadParameter("MoonTexture");

//            foreach (EffectPass p in EffectMap.Begin())
//            {
//                p.Begin();
//                TextureRenderer.Draw(gameTime);
//                p.End();
//            }

//            EffectMap.End();
//        }

//        #region Shader Members

//        public override void Draw(GameTime gameTime, SkyDomeShaderState state)
//        {
//            Engine.Instance.GraphicsDevice.RenderState.AlphaBlendEnable = true;
//            Engine.Instance.GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha;
//            Engine.Instance.GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
//            EffectMap.SetTechnique("Textured");
//            View = Camera.ActiveCamera.View;
//            Projection = Camera.ActiveCamera.Projection;

//            if (state.Theta < Math.PI / 2.0f || state.Theta > 3.0f * Math.PI / 2.0f)
//            {
//                Alpha = (float)Math.Abs(Math.Sin(state.Theta + (float)Math.PI / 2.0f));
//            }
//            else
//            {
//                Alpha = 0;
//            }

//            DrawGlow(gameTime, state);
//            DrawMoon(gameTime, state);
//            Engine.Instance.GraphicsDevice.RenderState.AlphaBlendEnable = false;
//        }

//        #endregion
//    }
//}
